La función merge permite unir 2 bases de datos usando una o un grupo de columnas (variables) como identificador de cada fila (observación).
x, y = dataframes u objetos a unir.
by, by.x, by.y = columnas que vamos a usar como identificador para hacer el merge.
all, all.x , all.y = indica que observaciones se quieren mantener el objetos despues de hacer merge.
suffixes = cadena de caracteres con un subindice para las columnas que se repiten en las dos bases.
Supongamos que tenemos 2 dataframes llamados A y B, que contiene la siguiente información:
matchSi no empleamos ninguno de los argumentos all de la función, R asume que all=F y va a conservar las observaciones que hacen match en las dos bases de datos.
merge(x = A,y = B,by="name")
## name id.x age id.y wage
## 1 Ariel 1201 15 1201 1000
## 2 Beto 1202 20 1202 1500
## 3 Juan 1203 30 1203 2000
Como tenemos dos variables que sirven como identificador en las dos bases de datos, R genera un identificador para cada una de las variables en la base de datos.
merge(x=A,y=B,by=c("name","id"))
## name id age wage
## 1 Ariel 1201 15 1000
## 2 Beto 1202 20 1500
## 3 Juan 1203 30 2000
Cuando agregamos la opción all=T, R va a conservar todas las observaciones en las dos bases de datos y va rellenar con NA las observaciones para las que no hay información en las dos bases de datos.
merge(x=A,y=B,by=c("name","id"),all=T)
## name id age wage
## 1 Ariel 1201 15 1000
## 2 Beto 1202 20 1500
## 3 Juan 1203 30 2000
## 4 Pedro 1204 40 NA
## 5 Sofi 1205 50 NA
## 6 Lili 1206 NA 2500
## 7 Vane 1207 NA 3000
ACuando agregamos la opción all.x=T, R va a conservar todas las observaciones de A y va rellenar con NA las columnas de B para las que no hay información de A.
merge(x=A,y=B,by=c("name","id"),all.x=T)
## name id age wage
## 1 Ariel 1201 15 1000
## 2 Beto 1202 20 1500
## 3 Juan 1203 30 2000
## 4 Pedro 1204 40 NA
## 5 Sofi 1205 50 NA
BCuando agregamos la opción all.x=T, R va a conservar todas las observaciones de B y va rellenar con NA las columnas de A para las que no hay información de B.
merge(x=A,y=B,by=c("name","id"),all.y=T)
## name id age wage
## 1 Ariel 1201 15 1000
## 2 Beto 1202 20 1500
## 3 Juan 1203 30 2000
## 4 Lili 1206 NA 2500
## 5 Vane 1207 NA 3000
Tomado de: https://lesjoiesducode.fr/git-merge-3
Supongamos que tenemos dos dataframe (data_1 y data_2) que contienen información para tres individuos en diferentes periodos de tiempo. En data_1 se puede observar a cada individuo en tres periodos de tiempo. En data_2 solo observamos a los individuos dos periodos de tiempo.
data_1
## id month wage
## 1 1 1 927
## 2 1 2 1058
## 3 1 3 1055
## 4 2 1 841
## 5 2 2 1043
## 6 2 3 1211
## 7 3 1 1171
## 8 3 2 883
## 9 3 3 815
data_2
## id date expenditure
## 1 1 1 587
## 2 1 2 528
## 3 2 1 444
## 4 2 2 553
## 5 3 1 496
## 6 3 2 532
Si se queremos unir a data_1 y data_2 en un dataframe (data_3), deberíamos obtener máximo 9 observaciones. Sin embargo, si omitimos la variable de tiempo, pasa esto:
data_3 = merge(x = data_1,y = data_2,by = 'id')
data_3
## id month wage date expenditure
## 1 1 1 927 1 587
## 2 1 1 927 2 528
## 3 1 2 1058 1 587
## 4 1 2 1058 2 528
## 5 1 3 1055 1 587
## 6 1 3 1055 2 528
## 7 2 1 841 1 444
## 8 2 1 841 2 553
## 9 2 2 1043 1 444
## 10 2 2 1043 2 553
## 11 2 3 1211 1 444
## 12 2 3 1211 2 553
## 13 3 1 1171 1 496
## 14 3 1 1171 2 532
## 15 3 2 883 1 496
## 16 3 2 883 2 532
## 17 3 3 815 1 496
## 18 3 3 815 2 532
Se duplicaron las observaciones de data_1 y hay 18 observaciones, todos los month se repiten para cada date. Ahora debemos buscar la variable
# Veamos los duplicados por id y month en date_1
paste0(data_1$id,data_1$month) %>% duplicated() %>% table()
## .
## FALSE
## 9
# Veamos los duplicados por id y date en date_2
paste0(data_2$id, data_2$date) %>% duplicated() %>% table()
## .
## FALSE
## 6
Ahora hagamos el merge usando la variable de tiempo y el id del usuario
data_4 = merge(x = data_1 , y = data_2 , by.x = c('id','month') ,by.y = c('id','date') , all.x = T)
data_4
## id month wage expenditure
## 1 1 1 927 587
## 2 1 2 1058 528
## 3 1 3 1055 NA
## 4 2 1 841 444
## 5 2 2 1043 553
## 6 2 3 1211 NA
## 7 3 1 1171 496
## 8 3 2 883 532
## 9 3 3 815 NA
La función rbind.fill pertenece al paquete plyr. Se usa para agregar observaciones a un dataframe usando el nombre de las variables (columnas) y llenando con NA las columnas que están ausentes en uno de los dos dataframes. Sigamos con el ejemplo de la base de datos data_1 y data_2.
plyr::rbind.fill(data_1 , data_2)
## id month wage date expenditure
## 1 1 1 927 NA NA
## 2 1 2 1058 NA NA
## 3 1 3 1055 NA NA
## 4 2 1 841 NA NA
## 5 2 2 1043 NA NA
## 6 2 3 1211 NA NA
## 7 3 1 1171 NA NA
## 8 3 2 883 NA NA
## 9 3 3 815 NA NA
## 10 1 NA NA 1 587
## 11 1 NA NA 2 528
## 12 2 NA NA 1 444
## 13 2 NA NA 2 553
## 14 3 NA NA 1 496
## 15 3 NA NA 2 532